<!DOCTYPE html>
<!-- saved from url=(0041)http://c.biancheng.net/view/vip_7044.html -->
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" async="" charset="utf-8" src="./1.8Java是如何实现跨平台的，原理是什么？_files/core.php"></script><script async="" src="./1.8Java是如何实现跨平台的，原理是什么？_files/click.php"></script>

<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面，任何其他内容都*必须*跟随其后！ -->
<!-- 启用Chromium高速渲染模式 -->
<meta name="renderer" content="webkit">
<meta name="force-rendering" content="webkit">
<!-- 禁止百度转码 -->
<meta name="applicable-device" content="pc,mobile">
<meta name="MobileOptimized" content="width">
<meta name="HandheldFriendly" content="true">
<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
<!-- 禁止识别电话号码 -->
<meta name="format-detection" content="telephone=no">

<link rel="shortcut icon" href="http://c.biancheng.net/favicon.ico?v=1.6.72">
<link href="./1.8Java是如何实现跨平台的，原理是什么？_files/common.css" rel="stylesheet">
<title>Java是如何实现跨平台的，原理是什么？</title>
<meta name="description" content="在 Java 语言白皮书上面有这样一段话： Java 是一种简单的，面向对象的，适用于网络应用的，平台无关的，解释的，健壮的，安全的，结构自然的，可移植的，高性能的，多线程的，动">
</head>
<body>
<div id="topbar" class="clearfix">
	<ul id="product-type" class="left">
		<li>
			<a href="http://c.biancheng.net/"><span class="iconfont iconfont-home"></span>首页</a>
		</li>
		<li class="active">
			<a href="http://c.biancheng.net/sitemap/" rel="nofollow"><span class="iconfont iconfont-book"></span>教程</a>
		</li>
		<li>
			<a href="http://vip.biancheng.net/p/vip/show.php" rel="nofollow" target="_blank"><span class="iconfont iconfont-vip"></span>VIP会员</a>
		</li>
		<li>
			<a href="http://vip.biancheng.net/p/q2a/show.php" rel="nofollow" target="_blank"><span class="iconfont iconfont-q2a"></span>一对一答疑</a>
		</li>
		<li>
			<a href="http://fudao.biancheng.net/" rel="nofollow" target="_blank"><span class="iconfont iconfont-fudao"></span>辅导班</a>
		</li>
	</ul>
</div>
<div id="header" class="clearfix">
	<a id="logo" class="left" href="http://c.biancheng.net/">
		<img height="26" src="./1.8Java是如何实现跨平台的，原理是什么？_files/logo.png" alt="C语言中文网">
	</a>
	<ul id="nav-main" class="hover-none left clearfix">
		<li class="wap-yes"><a href="http://c.biancheng.net/">首页</a></li>
		<li><a href="http://c.biancheng.net/c/">C语言教程</a></li>
		<li><a href="http://c.biancheng.net/cplus/">C++教程</a></li>
		<li><a href="http://c.biancheng.net/python/">Python教程</a></li>
		<li><a href="http://c.biancheng.net/java/">Java教程</a></li>
		<li><a href="http://c.biancheng.net/linux_tutorial/">Linux入门</a></li>
		<li><a href="http://c.biancheng.net/sitemap/" title="网站地图">更多&gt;&gt;</a></li>
	</ul>
	<span id="sidebar-toggle" class="toggle-btn" toggle-target="#sidebar">目录 <span class="glyphicon"></span></span>

	<a href="http://vip.biancheng.net/?from=topbar" class="user-info glyphicon glyphicon-user hover-none" target="_blank" rel="nofollow" title="用户中心"></a>
</div>
<div id="main" class="clearfix">
	<div id="sidebar" class="toggle-target">
	<div id="contents">
		<dt><span class="glyphicon glyphicon-option-vertical" aria-hidden="true"></span><a href="http://c.biancheng.net/java/">Java教程</a></dt>
		<dd class="this"> <span class="channel-num">1</span> <a href="http://c.biancheng.net/java/10/">Java入门基础及环境搭建</a> </dd><dl class="dl-sub"><dd>1.1 <a href="http://c.biancheng.net/view/1282.html">Java是什么</a></dd><dd>1.2 <a href="http://c.biancheng.net/view/vip_7043.html">Java程序员工资高么？就业方向有哪些？</a><span class="glyphicon glyphicon-usd"></span></dd><dd>1.3 <a href="http://c.biancheng.net/view/1286.html">Java JDK下载与安装教程</a></dd><dd>1.4 <a href="http://c.biancheng.net/view/1290.html">Java JDK环境变量配置</a></dd><dd>1.5 <a href="http://c.biancheng.net/view/5611.html">使用记事本编写运行Java程序</a></dd><dd>1.6 <a href="http://c.biancheng.net/view/1296.html">Java编程规范</a></dd><dd>1.7 <a href="http://c.biancheng.net/view/5607.html">Java程序的运行过程</a></dd><dd class="active">1.8 <a href="http://c.biancheng.net/view/vip_7044.html">Java是如何实现跨平台的，原理是什么？</a><span class="glyphicon glyphicon-usd"></span></dd><dd>1.9 <a href="http://c.biancheng.net/view/5591.html">Java中JVM、JRE和JDK三者有什么区别和联系？</a></dd><dd>1.10 <a href="http://c.biancheng.net/view/vip_7045.html">Java和C/C++到底有什么关系，它们有什么区别？</a><span class="glyphicon glyphicon-usd"></span></dd><dd>1.11 <a href="http://c.biancheng.net/view/5637.html">Java开发工具</a></dd><dd>1.12 <a href="http://c.biancheng.net/view/1298.html">Java Eclipse下载安装教程</a></dd><dd>1.13 <a href="http://c.biancheng.net/view/5631.html">使用Eclipse开发第一个Java程序</a></dd><dd>1.14 <a href="http://c.biancheng.net/view/1307.html">Java修改Eclipse编辑器字体大小</a></dd><dd>1.15 <a href="http://c.biancheng.net/view/1311.html">Java Eclipse如何调试代码</a></dd><dd>1.16 <a href="http://c.biancheng.net/view/5601.html">Eclipse快捷键大全</a></dd><dd>1.17 <a href="http://c.biancheng.net/view/5644.html">Java初学者容易犯的错误</a></dd><dd>1.18 <a href="http://c.biancheng.net/view/vip_7046.html">掌握这几个方法，学习Java事半功倍！</a><span class="glyphicon glyphicon-usd"></span></dd><dd>1.19 <a href="http://c.biancheng.net/view/5624.html">Java程序员学习路线</a></dd><dd>1.20 <a href="http://c.biancheng.net/view/vip_8118.html">目前主流的Java Web开发框架，初学者一定要了解！</a><span class="glyphicon glyphicon-usd"></span></dd></dl>
			<dd>
				<span class="channel-num">2</span>
				<a href="http://c.biancheng.net/java/20/">Java程序设计基础</a>
			</dd>
		
			<dd>
				<span class="channel-num">3</span>
				<a href="http://c.biancheng.net/java/30/">Java流程控制语句</a>
			</dd>
		
			<dd>
				<span class="channel-num">4</span>
				<a href="http://c.biancheng.net/java/40/">Java字符串处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">5</span>
				<a href="http://c.biancheng.net/java/50/">Java数字和日期处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">6</span>
				<a href="http://c.biancheng.net/java/60/">Java内置包装类</a>
			</dd>
		
			<dd>
				<span class="channel-num">7</span>
				<a href="http://c.biancheng.net/java/70/">Java数组处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">8</span>
				<a href="http://c.biancheng.net/java/80/">Java类和对象</a>
			</dd>
		
			<dd>
				<span class="channel-num">9</span>
				<a href="http://c.biancheng.net/java/90/">Java继承和多态</a>
			</dd>
		
			<dd>
				<span class="channel-num">10</span>
				<a href="http://c.biancheng.net/java/100/">Java异常处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">11</span>
				<a href="http://c.biancheng.net/java/110/">Java集合、泛型和枚举</a>
			</dd>
		
			<dd>
				<span class="channel-num">12</span>
				<a href="http://c.biancheng.net/java/120/">Java反射机制</a>
			</dd>
		
			<dd>
				<span class="channel-num">13</span>
				<a href="http://c.biancheng.net/java/130/">Java输入/输出流</a>
			</dd>
		
			<dd>
				<span class="channel-num">14</span>
				<a href="http://c.biancheng.net/java/java/135/">Java注解</a>
			</dd>
		
	</div>
</div>
	<div id="article-wrap">
		<div id="article">
			<div class="arc-info">
	<span class="position"><span class="glyphicon glyphicon-map-marker"></span> <a href="http://c.biancheng.net/">首页</a> &gt; <a href="http://c.biancheng.net/java/">Java教程</a> &gt; <a href="http://c.biancheng.net/java/10/">Java入门基础及环境搭建</a></span>
	<span class="read-num">阅读：25,691</span>
</div>

<div id="ad-position-bottom"></div>
			<h1>Java是如何实现跨平台的，原理是什么？</h1>
			<div class="pre-next-page clearfix">
                    <span class="pre left"><span class="icon">&lt;</span> <span class="text-brief text-brief-pre">上一页</span><a href="http://c.biancheng.net/view/5607.html">Java程序的运行过程</a></span>
                    <span class="next right"><a href="http://c.biancheng.net/view/5591.html">Java中JVM、JRE和JDK三者有什么区别和联系？</a><span class="text-brief text-brief-next">下一页</span> <span class="icon">&gt;</span></span>
                </div>
			<div id="ad-arc-top"><p class="pic"></p><p class="text" adid="java-1v1q2a"><a href="http://c.biancheng.net/view/7552.html" target="_blank" style="color: #D33428;">C语言中文网推出辅导班啦，包括<span style="color: #008000;">「C语言辅导班、C++辅导班、算法/数据结构辅导班」</span>，全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践 + 永久学习。QQ在线，随时响应！</a></p></div>
			<div id="arc-body">在 Java 语言白皮书上面有这样一段话：<span style="color:#b22222;">Java 是一种简单的，面向对象的，适用于网络应用的，平台无关的，解释的，健壮的，安全的，结构自然的，可移植的，高性能的，多线程的，动态的语言。</span><br>
<br>
就单从平台无关这一点上面来说，就已经超越 C/C++ 一大截了。就比如说我们在 Windows 下面写出来的一段 Java 程序，换成 Linux，macOS 系统里面，一样可以正常运行并且输出相同的结果，但是这一点，换成 C/C++ 却很难办到。那么跨平台的特性，就是 JVM 决定的了。<br>
<br>
JVM 的专业解释如下：<br>
<br>
<span style="color:#006400;">Java 虚拟机（Java Virtual Machine，简称 JVM）</span>是一种用于计算设备的规范，它是一个虚构出来的计算机，是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java 虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM 屏蔽了与具体操作系统平台相关的信息，使 Java 程序只需生成在 Java 虚拟机上运行的目标代码（字节码），就可以在多种平台上不加修改地运行。JVM 在执行字节码时，实际上最终还是把字节码解释成具体平台上的机器指令执行。<br>
<br>
上面的解释看不懂也比较正常，本来不想把专业解释放上来的，想了想还是算了，毕竟还是要让大家对 JVM 有一点详细的认识。如果看不懂专业解释的话，我就用大白话给大家说：<br>
<br>
JVM，也就是 Java 虚拟机，就是一个平台，包含于 JRE 的下面。当你需要执行某个 Java 程序时，由 JVM 帮你进行编译和执行。我们编写的 Java 源码，编译后会生成一种 .class 文件，称为字节码文件。Java 虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。<br>
<br>
而且，如图 1 所示，JVM 分为很多个系统版本的，你编写好的 Java 程序，无论到哪个平台上，Windows 也好，Linux 也好，macOS 也好，只需要找到 JVM，便可以成功编译和执行。也就是说，只要在不同平台上安装对应的 JVM，就可以运行字节码文件，运行我们编写的 Java 程序。所以这也就是 Java 跨平台性良好，平台无关特性的来历。<br>
<br>
而这个过程中，我们编写的 Java 程序没有做任何改变，仅仅是通过 JVM 这一”中间层“，就能在不同平台上运行，真正实现了”一次编译，到处运行“的目的。<br>
<br>
JVM 是一个“桥梁”，是一个“中间件”，是实现跨平台的关键，Java 代码首先被编译成字节码文件，再由 JVM 将字节码文件翻译成机器语言，从而达到运行 Java 程序的目的。<br>
<br>
<span style="color:#b22222;">注意：编译的结果不是生成机器码，而是生成字节码，字节码不能直接运行，必须通过 JVM 翻译成机器码才能运行。不同平台下编译生成的字节码是一样的，但是由 JVM 翻译成的机器码却不一样。</span><br>
<br>
所以，运行 Java 程序必须有 JVM 的支持，因为编译的结果不是机器码，必须要经过 JVM 的再次翻译才能执行。即使你将 Java 程序打包成可执行文件（例如 .exe），仍然需要JVM的支持。<br>
<br>
<span style="color:#b22222;">注意：跨平台的是 Java 程序，不是 JVM。JVM 是用 C/C++ 开发的，是编译后的机器码，不能跨平台，不同平台下需要安装不同版本的 JVM。</span><br>
<br>
<div style="text-align: center;">
	<img alt="" src="./1.8Java是如何实现跨平台的，原理是什么？_files/5-1ZZ3135100510.png"><br>
	图 1 &nbsp;JVM 实现跨平台</div>
<h2>
	关于JVM的执行效率</h2>
Java 推出的前几年，人们有不同的看法，解释字节码肯定比全速运行机器码慢很多，牺牲性能换来跨平台的优势是否值得？<br>
<br>
然而，JVM 有一个选项，可以将使用最频繁的字节码翻译成机器码并保存，这一过程被称为即时编译。这种方式确实很有效，致使微软的 .NET 平台也使用了虚拟机。<br>
<br>
现在的即时编译器已经相当出色，甚至成了传统编译器的竞争对手，某些情况下甚至超过了传统编译器，原因是 JVM 可以监控运行时信息。例如，即时编译器可以监控使用频率高的代码并进行优化，可以消除函数调用（即“内嵌”）。<br>
<br>
但是，Java 毕竟有一些 C/C++ 没有的额外的开销，关键应用程序速度较慢。比如 Java 采用了与平台无关的绘图方式，GUI 程序（客户端程序）执行要慢；虚拟机启动也需要时间。<br>
<h2>
	客户端市场的折戟</h2>
Java 的 GUI 库称不上出色，界面不算友好，大部分用户不太习惯；Java 的客户端资源消耗也比较大，大数据量的应用和功能复杂的应用性能堪忧。<br>
<br>
更加不能接受的是，微软因自身利益和 SUN 分家后，Windows&nbsp; 便不再预装 JVM 了，用户安装你的程序之前，必须要安装 JVM 并正确设置，你可以要求普通用户安装你的软件，但是你能期望他了解 JVM 的有关知识并正确安装设置吗？<br>
<br>
虽然你可以将 JVM 集成在你的程序中，自动安装并设置，不让用户干预，但是你希望附带一个比你的程序还要大好多的 JVM 吗？一个软件这样做或许可以接受，成千上万个软件都这样做，那用户要安装多少个 JVM？磁盘空间要浪费多少？<br>
<br>
所以，直接投放市场的面向普通用户的客户端程序，用 Java 开发的很少，大部分 Java 开发的客户端是给企业内部员工使用，员工领到电脑时，技术部已经给配置好了。如果你希望从事客户端开发，建议学习 C/C++ 和 .NET，它们在 Window 客户端开发方面有较大的优势。<br>
<br>
种种原因，注定了 Java 客户端不利于推向市场，让普通用户接受。不过话又说回来，客户端开发也不是 Java 的初衷，Java 最初是面向嵌入式的，却随着互联网的兴起而快速成长，在 Web 开发上大显身手。</div>
			<div id="arc-append">
	<p>关注微信公众号「站长严长生」，在手机上阅读所有教程，随时随地都能学习。本公众号由<a class="col-link" href="http://c.biancheng.net/view/8092.html" target="_blank" rel="nofollow">C语言中文网站长</a>运营，每日更新，坚持原创，敢说真话，凡事有态度。</p>
	<p style="margin-top:12px; text-align:center;">
		<img width="180" src="./1.8Java是如何实现跨平台的，原理是什么？_files/qrcode_weixueyuan_original.png" alt="魏雪原二维码"><br>
		<span class="col-green">微信扫描二维码关注公众号</span>
	</p>
</div>
<!-- <p>关注微信公众号「魏雪原」，跟着<a class="col-link" href="/view/8092.html" target="_blank">站长</a>一起学习，拒绝躺平，跳出内卷，用知识完成阶级跃升：</p>
	<ul>
		<li>每日更新，坚持原创，敢说真话，凡事有态度。</li>
		<li>编程+求职+创业+营销，既有硬知识，也有软技能。</li>
		<li>手机端阅读教程，随时随地都能学习。</li>
		<li>即将绑定网站部分功能，包括注册登录、找回密码、获取下载链接等。</li>
	</ul> -->
			<div class="pre-next-page clearfix">
                    <span class="pre left"><span class="icon">&lt;</span> <span class="text-brief text-brief-pre">上一页</span><a href="http://c.biancheng.net/view/5607.html">Java程序的运行过程</a></span>
                    <span class="next right"><a href="http://c.biancheng.net/view/5591.html">Java中JVM、JRE和JDK三者有什么区别和联系？</a><span class="text-brief text-brief-next">下一页</span> <span class="icon">&gt;</span></span>
                </div>
			<div id="ad-arc-bottom"></div>

<!-- <div id="ad-bottom-weixin" class="clearfix">
	<div class="left" style="width: 535px;">
		<p><span class="col-red">编程帮</span>，一个分享编程知识的公众号。跟着<a class="col-link" href="/cpp/about/author/" target="_blank">站长</a>一起学习，每天都有进步。</p>
		<p>通俗易懂，深入浅出，一篇文章只讲一个知识点。</p>
		<p>文章不深奥，不需要钻研，在公交、在地铁、在厕所都可以阅读，随时随地涨姿势。</p>
		<p>文章不涉及代码，不烧脑细胞，人人都可以学习。</p>
		<p>当你决定关注「编程帮」，你已然超越了90%的程序员！</p>
	</div>
	<div class="right" style="width: 150px;">
		<img width="150" src="/templets/new/images/erweima_biancheng.gif?v=1.6.72" alt="编程帮二维码" /><br />
		<span class="col-green">微信扫描二维码关注</span>
	</div>
</div> -->

<div id="nice-arcs" class="box-bottom">
	<h4>优秀文章</h4>
	<ul class="clearfix">
<li><a href="http://c.biancheng.net/view/1970.html" title="堆叠自编码器及（TensorFlow）实现（详解版）">堆叠自编码器及（TensorFlow）实现（详解版）</a></li>
<li><a href="http://c.biancheng.net/view/2356.html" title="网络数据的大小端问题">网络数据的大小端问题</a></li>
<li><a href="http://c.biancheng.net/view/4391.html" title="MVC设计模式简介">MVC设计模式简介</a></li>
<li><a href="http://c.biancheng.net/view/5931.html" title="使用script标签加载远程数据">使用script标签加载远程数据</a></li>
<li><a href="http://c.biancheng.net/view/vip_7326.html" title="Go语言使用匿名结构体解析JSON数据">Go语言使用匿名结构体解析JSON数据</a></li>
<li><a href="http://c.biancheng.net/view/7794.html" title="NW.js和Electron优缺点综合对比">NW.js和Electron优缺点综合对比</a></li>
<li><a href="http://c.biancheng.net/redis2/lindex_command.html" title="Redis LINDEX命令">Redis LINDEX命令</a></li>
<li><a href="http://c.biancheng.net/jstl/c-foreach.html" title="&lt;c:forEach&gt;标签">&lt;c:forEach&gt;标签</a></li>
<li><a href="http://c.biancheng.net/pillow/image-resizing.html" title="Pillow图像缩放操作">Pillow图像缩放操作</a></li>
<li><a href="http://c.biancheng.net/pygame/font.html" title=" Pygame Font文本和字体（含示例）"> Pygame Font文本和字体（含示例）</a></li>
</ul>
</div>
		</div>
		
	</div>
</div>
<script type="text/javascript">
// 当前文章ID
window.arcIdRaw = 'a_' + 7044;
window.arcId = "a57dYN7dEEQSCbGVCH355YHROH+J+cs0kG3Bi/U6UpLj5c5ihxSX19vieRo";
window.typeidChain = "117|79";
</script>
<div id="footer" class="clearfix">
	<div class="info left">
	<p>精美而实用的网站，分享优质编程教程，帮助有志青年。千锤百炼，只为大作；精益求精，处处斟酌；这种教程，看一眼就倾心。</p>
	<p>
		<a href="http://c.biancheng.net/view/8066.html" target="_blank" rel="nofollow">关于网站</a> <span>|</span>
		<a href="http://c.biancheng.net/view/8092.html" target="_blank" rel="nofollow">关于站长</a> <span>|</span>
		<a href="http://c.biancheng.net/view/8097.html" target="_blank" rel="nofollow">如何完成一部教程</a> <span>|</span>
		<a href="http://c.biancheng.net/view/8093.html" target="_blank" rel="nofollow">联系我们</a> <span>|</span>
		<a href="http://c.biancheng.net/sitemap/" target="_blank" rel="nofollow">网站地图</a>
	</p>
	<p>Copyright ©2012-2021 biancheng.net, <a href="http://www.beian.miit.gov.cn/" target="_blank" rel="nofollow" style="color:#666;">陕ICP备15000209号</a></p>
	</div>
	<img class="right" src="./1.8Java是如何实现跨平台的，原理是什么？_files/logo_bottom.gif" alt="底部Logo">
	<span id="return-top"><b>↑</b></span>
</div>

<script type="text/javascript">
window.siteId = 4;
window.cmsTemplets = "/templets/new";
window.cmsTempletsVer = "1.6.72";
</script>

<script src="./1.8Java是如何实现跨平台的，原理是什么？_files/jquery1.12.4.min.js.下载"></script>
<script src="./1.8Java是如何实现跨平台的，原理是什么？_files/common.js.下载"></script>
<span style="display:none;"><script src="./1.8Java是如何实现跨平台的，原理是什么？_files/z_stat.php" type="text/javascript" defer="defer" async="async"></script></span>

</body></html>